package controlador;

import java.util.ArrayList;
import java.util.List;

import mapper.AdmPersistenciaTragamonedas;
import modelo.Casilla;
import modelo.Comodin;
import modelo.Fruta;
import modelo.Jugada;
import modelo.Premio;
import modelo.Rodillo;

public class Tragamonedas {
	
	private static long ultimoID = 0;
	private long id;
	private List<Rodillo> rodillos;
	private List<Casilla> casillas;
	private List<Jugada> jugadas;
	private List<Premio> premios;
	private float recaudacionInicial;
	private float recaudacionActual;
	private float recaudacionMinima;
	
	private static Tragamonedas instancia;

	public static Tragamonedas getInstancia(){
		if (instancia == null)
			instancia = new Tragamonedas();
		return instancia;
	}

	
	public Tragamonedas() {
		this.setId(getProximoID());
		this.rodillos = new ArrayList<Rodillo>();
		this.casillas = new ArrayList<Casilla>();
		this.jugadas = new ArrayList<Jugada>();
		this.premios = new ArrayList<Premio>();
		this.setRecaudacionActual(0);
		this.setRecaudacionInicial(0);
		this.setRecaudacionMinima(0);
	}
	
	public Tragamonedas(long id, ArrayList<Rodillo> rodillos, ArrayList<Casilla> casillas, ArrayList<Jugada> jugadas, ArrayList<Premio> premios, float recaudacionInicial, float recaudacionActual, float recaudacionMinima) {
		this.setId(id);
		this.rodillos = rodillos;
		this.casillas = casillas;
		this.jugadas = jugadas;
		this.premios = premios;
		this.setRecaudacionActual(recaudacionActual);
		this.setRecaudacionInicial(recaudacionInicial);
		this.setRecaudacionMinima(recaudacionMinima);
	}
	
	public void modificarParametros(float recaudacionInicial, float recaudacionActual, float recaudacionMinima) {
		this.setRecaudacionActual(recaudacionActual);
		this.setRecaudacionInicial(recaudacionInicial);
		this.setRecaudacionMinima(recaudacionMinima);
	}
	
	public void insertarDatos(){
		AdmPersistenciaTragamonedas.getInstancia().insertar(this);
	}
	
	public void actualizarDatos(){
		AdmPersistenciaTragamonedas.getInstancia().actualizar(this);
	}
	
	public void eliminarDatos(){
		AdmPersistenciaTragamonedas.getInstancia().borrar(this);	
	}
	
	public long agregarCasilla(String nombre) {
		Casilla c;
		if (nombre == "Comodin")
			c = new Comodin((int) this.getId(), null);
		else
			c = new Fruta((int) this.getId(), nombre);
		c.insertarDatos();
		casillas.add(c);
		
		return c.getId();
	}
	
	
	public long agregarRodillo(Rodillo r) {
		rodillos.add(r);
		return r.getId();
	}
	
	public void removerRodillo(long idRodillo) {
		Rodillo rodillo = encontrarRodillo(idRodillo);
		rodillos.remove(rodillo);
		
		//Update position of rollers
		for (int i=0; i<rodillos.size(); i++) {
			rodillos.get(i).setPosicion(i);
		}
	}

	// PRIVATE
	private Rodillo encontrarRodillo(long idRodillo) {
		int i=0;
		while (i<rodillos.size() && !rodillos.get(i).esRodillo(idRodillo)) {
			i++;
		}
		if (i<rodillos.size()) 	
			return rodillos.get(i);
		else 					
			return null;
	}
	
	private Casilla encontrarCasilla(long idCasilla) {
		int i=0;
		while (i<casillas.size() && !casillas.get(i).esCasilla(idCasilla)) {
			i++;
		}
		if (i<casillas.size())	return casillas.get(i);
		else					return null;
	}
	
	private Premio encontrarPremio(long idPrize) {
		int i=0;
		while (i<premios.size() && !premios.get(i).esPremio(idPrize)) {
			i++;
		}
		if (i<premios.size())	return premios.get(i);
		else					return null;
	}
	
	public static long getProximoID() {
		return ++ultimoID;
	}
	
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public List<Rodillo> getRodillos() {
		return rodillos;
	}

	public void setRodillos(List<Rodillo> rodillos) {
		this.rodillos = rodillos;
	}

	public List<Casilla> getCasillas() {
		return casillas;
	}

	public void setCasillas(List<Casilla> casillas) {
		this.casillas = casillas;
	}

	public List<Jugada> getJugadas() {
		return jugadas;
	}

	public void setJugadas(List<Jugada> jugadas) {
		this.jugadas = jugadas;
	}

	public List<Premio> getPremios() {
		return premios;
	}

	public void setPremios(List<Premio> premios) {
		this.premios = premios;
	}

	public float getRecaudacionInicial() {
		return recaudacionInicial;
	}

	public void setRecaudacionInicial(float recaudacionInicial) {
		this.recaudacionInicial = recaudacionInicial;
	}

	public float getRecaudacionActual() {
		return recaudacionActual;
	}

	public void setRecaudacionActual(float recaudacionActual) {
		this.recaudacionActual = recaudacionActual;
	}

	public float getRecaudacionMinima() {
		return recaudacionMinima;
	}

	public void setRecaudacionMinima(float recaudacionMinima) {
		this.recaudacionMinima = recaudacionMinima;
	}

}
